package com.xncoding.design.observation.demo1;
/**
 * 产品
 * @author Administrator
 *
 */
public class Product {

	private int id;

	public Product(int id){
		this.id=id;
	}
	public Product(){
	}
	
	@Override
	public String toString(){
		return "产品"+this.id;
		
	}
	
	/**
	 * 重写equals
	 */
	@Override
	public boolean equals(Object other){
		if(this==other){
			return true;
		}
		
		if(other==null){
			return false;
		}
		
		if(!(other instanceof Product)){
			 return false;
		}
		final Product product = (Product)other;
		
		//验证属性
		if(this.id==product.id){
			  return true;
		}
			 
		return false;
	}
	
	
	/**
	 * 重载hashCode;
	 * 重载equals必须
	 *  int result = 17;  //任意素数  
		 result = 31*result +c1; //c1,c2是什么看下文解释  
		  result = 31*result +c2;  
		  return result;  
	 *  其中c1,c2是我们生成的你要计算在内的字段的代码，生成规则如下
	 *  "你要计算在内":是指equals中所涉及的有效字段
	 *  
	 *  如果字段是boolean 计算为(f?1:0);
		如果字段是byte,char,short,int则计算为 (int)f;
		如果字段是long 计算为 (int)(f^(f>>32));
		如果字段是float 计算为 Float.floatToLongBits(f);
		如果字段是一个引用对象，那么直接调用对象的hashCode方法，如果需要判空，可以加上如果为空就返回0;
		如果字段是一个数组则需要遍历所有元素，按上面几种方法计算；
		 
		当你写完后hashCode方法后问问自己
		1、是否两个equal的实例，拥有相同的jhashCode
		2、两个不同的实例，是否拥有相同的hashCode
	 */
	@Override
	public int hashCode(){
		int result=17;//任意素数
		result=31*result+id;
		return result;
	}
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
}
